/**
 * Created by PanJiaChen on 16/11/18.
 */

/**
 * Parse the time to string
 * @param {(Object|string|number)} time
 * @param {string} cFormat
 * @returns {string}
 */
export function parseTime (time, cFormat) {
  if (arguments.length === 0) {
    return null
  }
  const format = cFormat || "{y}-{m}-{d} {h}:{i}:{s}"
  let date
  if (typeof time === "object") {
    date = time
  } else {
    if (typeof time === "string" && /^[0-9]+$/.test(time)) {
      time = parseInt(time)
    }
    if (typeof time === "number" && time.toString().length === 10) {
      time = time * 1000
    }
    date = new Date(time)
  }
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay(),
  }
  const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
    let value = formatObj[key]
    // Note: getDay() returns 0 on Sunday
    if (key === "a") {
      return ["日", "一", "二", "三", "四", "五", "六"][value]
    }
    if (result.length > 0 && value < 10) {
      value = "0" + value
    }
    return value || 0
  })
  return time_str
}

/**
 * @param {number} time
 * @param {string} option
 * @returns {string}
 */
export function formatTime (time, option) {
  if (("" + time).length === 10) {
    time = parseInt(time) * 1000
  } else {
    time = +time
  }
  const d = new Date(time)
  const now = Date.now()

  const diff = (now - d) / 1000

  if (diff < 30) {
    return "刚刚"
  } else if (diff < 3600) {
    // less 1 hour
    return Math.ceil(diff / 60) + "分钟前"
  } else if (diff < 3600 * 24) {
    return Math.ceil(diff / 3600) + "小时前"
  } else if (diff < 3600 * 24 * 2) {
    return "1天前"
  }
  if (option) {
    return parseTime(time, option)
  } else {
    return d.getMonth() + 1 + "月" + d.getDate() + "日" + d.getHours() + "时" + d.getMinutes() + "分"
  }
}

/**
 * @param {string} url
 * @returns {Object}
 */
export function param2Obj (url) {
  const search = url.split("?")[1]
  if (!search) {
    return {}
  }
  return JSON.parse(
    '{"' +
    decodeURIComponent(search)
      .replace(/"/g, '\\"')
      .replace(/&/g, '","')
      .replace(/=/g, '":"')
      .replace(/\+/g, " ") +
    '"}'
  )
}

export function isJSON (val) {
  if (typeof val !== "string") {
    return false
  }
  try {
    const obj = JSON.parse(val)
    if (Object.prototype.toString.call(obj) === "[object Object]") {
      return true
    } else {
      return false
    }
  } catch (e) {
    return false
  }
}

export function filterParam (data) {
  const _filterParam = [
    (data) => {
      const obj = {}
      for (const k in data) {
        if (data[k] !== undefined && data[k] !== "") {
          obj[k] = data[k]
        }
      }
      return obj
    },
  ]
  return _filterParam.reduce((data, fn) => fn(data), data)
}

const LOG_PREFIX = "trtc-callling-webrtc-demo:"

export function isValidatePhoneNum (phoneNum) {
  const reg = new RegExp("^1[0-9]{10}$", "gi")
  return phoneNum.match(reg)
}

export function isUserNameValid (username) {
  return username && username.length <= 20
}

export function setUserLoginInfo ({ token, phoneNum }) {
  localStorage.setItem("userInfo", JSON.stringify({ token, phoneNum }))
}

export function addToSearchHistory (searchUser) {
  const MAX_HISTORY_NUM = 3
  let searchUserList = getSearchHistory()
  const found = searchUserList.find((user) => user.userId === searchUser.userId)
  if (!found) {
    searchUserList.push(searchUser)
  }
  if (searchUserList.length > MAX_HISTORY_NUM) {
    searchUserList = searchUserList.slice(-MAX_HISTORY_NUM)
  }
  localStorage.setItem("searchHistory", JSON.stringify(searchUserList))
}

export function getSearchHistory () {
  try {
    return JSON.parse(localStorage.getItem("searchHistory") || "[]")
  } catch (e) {
    return []
  }
}

export function getUserLoginInfo () {
  try {
    return JSON.parse(localStorage.getItem("userInfo") || "{}")
  } catch (e) {
    return {}
  }
}

export function log (content) {
  console.log(`${LOG_PREFIX} ${content}`)
}

export function getRandomNum () {
  var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  let nums = ""
  for (let i = 0; i < 32; i++) {
    const id = parseInt(Math.random() * 10)
    nums += arr[id]
  }
  return nums
}

/**
 * @description 判断该值是不是一个空值
 * @param {any} val
 */
export function isDef (val) {
  return val !== null && val !== undefined
}

export function getQueryString (name) {
  const reg = new RegExp("(^|&|\\?)" + name + "=([^&]*)(&|$)", "i")
  const r = window.location.href.match(reg)
  if (r != null) {
    return decodeURIComponent(r[2])
  }
  return null
}

export function digitUppercase (n) {
  const fraction = ['角', '分'];
  const digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
  const unit = [['元', '万', '亿'], ['', '拾', '佰', '仟']];
  const head = n < 0 ? '欠' : '';
  n = Math.abs(n);

  let s = '';

  for (let i = 0; i < fraction.length; i++) {
    const digitNum = digit[Math.floor(n * 10 * Math.pow(10, i)) % 10];
    const fractionName = fraction[i];

    if (digitNum === '零') {
      s += digitNum + fractionName;
      if (fractionName === '分' && s === '零角零分') {
        s = '整';
      } else if (digitNum + fractionName === '零分') {
        s = s.replace('零分', '整');
      }
    } else {
      s += (digitNum + fractionName).replace(/零./, '整');
    }
  }

  s = s || '整';
  n = Math.floor(n);

  for (let i = 0; i < unit[0].length && n > 0; i++) {
    let p = '';
    for (let j = 0; j < unit[1].length && n > 0; j++) {
      p = digit[n % 10] + unit[1][j] + p;
      n = Math.floor(n / 10);
    }
    s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;
  }

  return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整');
}
